using UnityEngine;
using UnityEngine.UI;
using UnityEngine.Events;

/// <summary>
/// 分数管理器，用于处理分数的加减和UI显示
/// </summary>
public class ScoreManager : MonoBehaviour
{
    [Header("UI设置")]
    [Tooltip("显示分数的Text组件，格式应为'分数：00'")]
    public Text scoreText;

    [Header("事件设置")]
    [Tooltip("分数改变时触发的事件")]
    public UnityEvent<int> onScoreChanged;

    [Tooltip("当分数达到10时触发的事件")]
    public UnityEvent onScoreReachedTen;

    private int currentScore = 0; // 当前分数
    private bool hasReachedTen = false; // 标记是否已达到10分
    private static ScoreManager instance; // 单例实例

    /// <summary>
    /// 单例实例，确保全局唯一访问点
    /// </summary>
    public static ScoreManager Instance
    {
        get
        {
            if (instance == null)
            {
                Debug.LogError("ScoreManager实例不存在，请在场景中添加ScoreManager组件");
            }
            return instance;
        }
    }

    private void Awake()
    {
        // 单例模式实现
        if (instance == null)
        {
            instance = this;
            DontDestroyOnLoad(gameObject); // 切换场景时不销毁
        }
        else
        {
            Destroy(gameObject);
        }

        // 初始化UI显示
        UpdateScoreUI();
    }

    /// <summary>
    /// 增加分数
    /// </summary>
    /// <param name="amount">增加的分数值（必须为正数）</param>
    public void AddScore(int amount)
    {
        if (amount <= 0)
        {
            Debug.LogWarning("增加的分数必须为正数");
            return;
        }

        currentScore += amount;
        UpdateScoreUI();
        onScoreChanged?.Invoke(currentScore);
    }

    /// <summary>
    /// 减少分数
    /// </summary>
    /// <param name="amount">减少的分数值（必须为正数）</param>
    public void SubtractScore(int amount)
    {
        if (amount <= 0)
        {
            Debug.LogWarning("减少的分数必须为正数");
            return;
        }

        currentScore = Mathf.Max(0, currentScore - amount); // 确保分数不会小于0
        UpdateScoreUI();
        onScoreChanged?.Invoke(currentScore);
    }

    /// <summary>
    /// 获取当前分数
    /// </summary>
    /// <returns>当前分数值</returns>
    public int GetCurrentScore()
    {
        return currentScore;
    }

    /// <summary>
    /// 重置分数为0
    /// </summary>
    public void ResetScore()
    {
        currentScore = 0;
        hasReachedTen = false; // 重置标志位
        UpdateScoreUI();
        onScoreChanged?.Invoke(currentScore);
    }

    /// <summary>
    /// 更新UI显示的分数
    /// </summary>
    private void UpdateScoreUI()
    {
        if (scoreText == null)
        {
            Debug.LogError("未分配scoreText，请在Inspector中指定显示分数的Text组件");
            return;
        }

        // 确保分数显示为两位数格式（例如：05, 12, 99）
        scoreText.text = string.Format("分数：{0:D2}", currentScore);

        // 检查分数是否达到10且尚未触发过事件
        if (currentScore >= 10 && !hasReachedTen)
        {
            onScoreReachedTen?.Invoke();
            hasReachedTen = true; // 标记为已触发
        }
    }

    /// <summary>
    /// 编辑器模式下验证参数
    /// </summary>
    private void OnValidate()
    {
        if (scoreText != null)
        {
            // 确保初始显示格式正确
            if (!scoreText.text.Contains("分数："))
            {
                Debug.LogWarning("scoreText的初始文本应包含'分数：'前缀");
            }
        }
    }
}

/// <summary>
/// 使用说明：
/// 1. 在场景中创建一个空物体，添加此ScoreManager组件
/// 2. 将显示分数的Text组件拖拽到scoreText字段
/// 3. 确保Text的初始文本格式为"分数：00"
/// 4. 其他脚本中通过以下方式调用：
///    - 增加分数：ScoreManager.Instance.AddScore(1);
///    - 减少分数：ScoreManager.Instance.SubtractScore(1);
///    - 获取分数：int score = ScoreManager.Instance.GetCurrentScore();
///    - 重置分数：ScoreManager.Instance.ResetScore();
/// 5. 可在Inspector中添加onScoreChanged事件，响应分数变化
/// 6. 可在Inspector中添加onScoreReachedTen事件，当分数首次达到10时触发
/// </summary>